home *** CD-ROM | disk | FTP | other *** search
/ Just Call Me Internet / Just Call Me Internet.iso / prog / atari / c / stngpasm / pure_c / include / uran / uran_sys.sh < prev    next >
Encoding:
Text File  |  1997-08-18  |  34.7 KB  |  1,339 lines

  1. ;----------------------------------------------------------------------------
  2. ;File name:    URAn_SYS.SH            Revision date:    1997.08.18
  3. ;Creator:    Ulf Ronald Andersson        Creation date:    1992.11.15
  4. ;(c)1992 by:    Ulf Ronald Andersson        All rights reserved
  5. ;Released as:    FREEWARE            (commercial sale forbidden)
  6. ;----------------------------------------------------------------------------
  7. ;Purpose:    Main macro & symbol library for Atari ST systems
  8. ;----------------------------------------------------------------------------
  9. ;Required header declarations:
  10. ;
  11. ;    include    "uran\STRUCT.SH"
  12. ;    include    "uran\URAn_SYS.SH"
  13. ;
  14. ;----------------------------------------------------------------------------
  15. ;
  16.     .super        ;allow supervisor instructions
  17. ;
  18. ;----------------------------------------------------------------------------
  19. ;    The following 10 Macros implement assembly time indirection
  20. ;    and allow indexed assemblytime constant and variable arrays,
  21. ;    as well as many other creative assemblytime 'tricks'.
  22. ;
  23. ;    ev_isym    dest,prefix,suffix    => dest = prefixXXXX
  24. ;    sv_isym    prefix,suffix,value    => prefixXXXX = value
  25. ;    sc_isym    prefix,suffix,value    => prefixXXXX equ value
  26. ;    sl_isym    prefix,suffix        => prefixXXXX: label defined
  27. ;    op_isym    opmnem,prefix,suffix    => opmnem prefixXXXX
  28. ;
  29. ;    Above "XXXX" represents whatever hex digits the 'suffix' parameter
  30. ;    produces as the expression is evaluated, thus modifying the symbol.
  31. ;
  32. ;    The other four macros are purely internal submacros
  33. ;
  34. .MACRO    ev_isym    dest_sym,prefix,suffix
  35.     sub_ev_isym    dest_sym,prefix,$(suffix)
  36. .ENDM
  37. ;
  38. .MACRO    sub_ev_isym    dest_sym,prefix,hexnum
  39. dest_sym    =    prefix&hexnum
  40. .ENDM
  41. ;
  42. .MACRO    sv_isym    prefix,suffix,value
  43.     sub_sv_isym    prefix,$(suffix),value
  44. .ENDM
  45. ;
  46. .MACRO    sub_sv_isym    prefix,hexnum,value
  47. prefix&hexnum    =    value
  48. .ENDM
  49. ;
  50. .MACRO    sc_isym    prefix,suffix,value
  51.     sub_sc_isym    prefix,$(suffix),value
  52. .ENDM
  53. ;
  54. .MACRO    sub_sc_isym    prefix,hexnum,value
  55. prefix&hexnum    equ    value
  56. .ENDM
  57. ;
  58. .MACRO    sl_isym    prefix,suffix
  59.     sub_sl_isym    prefix,$(suffix)
  60. .ENDM    sl_isym
  61. ;
  62. .MACRO    sub_sl_isym    prefix,hexnum
  63. prefix&hexnum:
  64. .ENDM    sub_sl_isym
  65. ;
  66. .MACRO    op_isym    opmnem,prefix,suffix
  67.     sub_op_isym    opmnem,prefix,$(suffix)
  68. .ENDM    op_isym
  69. ;
  70. .MACRO    sub_op_isym    opmnem,prefix,hexnum
  71.     &opmnem    prefix&hexnum
  72. .ENDM    sub_op_isym
  73. ;
  74. ;----------------------------------------------------------------------------
  75. ;The 'uni__v' symbol should be used by macros, when generating label
  76. ;groups unique to each entry to such a macro.  It should be incremented after
  77. ;use, and is intended as suffix argument to the ..._isym macros above.
  78. ;NB: using a common symbol for this purpose increases uniqueness integrity,
  79. ;    but care must be taken when submacros also use it.
  80. ;
  81. uni__v    =    0
  82. ;
  83. ;----------------------------------------------------------------------------
  84. ;    Macro to reserve named suffix-sized chunks in an array.
  85. ;    Intended for use as submacro in some other libs.
  86. ;    The indexes are positive, relating to array start.
  87. ;
  88. arr__pos    =    0
  89. ;
  90.     .MACRO    res_arr.size    name,count
  91.     .IF    (('&.size' == '.b') | ('&.size' == '.B'))
  92. name        =    arr__pos
  93. arr__pos    =    name+(count)
  94.     .ELSE
  95.     .IF    (('&.size' == '.w') | ('&.size' == '.W'))
  96. name        =    (arr__pos+1)&-2
  97. arr__pos    =    name+((count)<<1)
  98.     .ELSE
  99.     .IF    (('&.size' == '.l') | ('&.size' == '.L'))
  100. name        =    (arr__pos+1)&-2
  101. arr__pos    =    name+((count)<<2)
  102.     .ELSE
  103.     .IF    ('&.size' == '.0')
  104. arr__pos    =    0    ;reset arr__pos at start of array
  105.     .ELSE
  106.     .ERROR    "Bad size for macro res_arr &name,&count"
  107.     .ENDIF
  108.     .ENDIF
  109.     .ENDIF
  110.     .ENDIF
  111.     .ENDM    ;ends    res_arr
  112. ;
  113. ;----------------------------------------------------------------------------
  114. ;    Macro to reserve named suffix-sized chunks in a stack.
  115. ;    Intended for use as submacro in some other libs.
  116. ;    The indexes are negative, relating to stack end.
  117. ;
  118. stk__pos    =    0
  119. ;
  120.     .MACRO    res_stk.size    name,count
  121.     .IF    (('&.size' == '.b') | ('&.size' == '.B'))
  122. stk__pos    =    stk__pos-(count)
  123. name        =    stk__pos
  124.     .ELSE
  125.     .IF    (('&.size' == '.w') | ('&.size' == '.W'))
  126. stk__pos    =    (stk__pos-((count)<<1))&-2
  127. name        =    stk__pos
  128.     .ELSE
  129.     .IF    (('&.size' == '.l') | ('&.size' == '.L'))
  130. stk__pos    =    (stk__pos-((count)<<2))&-2
  131. name        =    stk__pos
  132.     .ELSE
  133.     .IF    ('&.size' == '.0')
  134. stk__pos    =    0    ;reset stk__pos at start of stack
  135.     .ELSE
  136.     .ERROR    "Bad size for macro res_stk &name,&count"
  137.     .ENDIF
  138.     .ENDIF
  139.     .ENDIF
  140.     .ENDIF
  141.     .ENDM    ;ends    res_stk
  142. ;
  143. ;----------------------------------------------------------------------------
  144. ;    Macros to ease porting of C functions to assembly code.
  145. ;    These implement simple declaration of local variables.
  146. ;
  147. lv_grp    =    0
  148. ;
  149.     .MACRO    lv_init    areg
  150. lv_grp    =    lv_grp+1
  151. lv_pos    =    0
  152.     ev_isym    lv_temp,lv_end_,lv_grp
  153.     link    areg,#lv_temp
  154.     .ENDM
  155. ;
  156.     .MACRO    lv_exit    areg
  157.     sc_isym    lv_end_,lv_grp,(lv_pos&-2)
  158.     unlk    areg
  159.     .ENDM
  160. ;
  161.     .MACRO    lvar.size    name,count
  162.     res_stk.size    lv_pos,count
  163. name    equ    lv_pos
  164.     .ENDM
  165. ;
  166. ;----------------------------------------------------------------------------
  167. ;    Three macros to implement CDECL argument handling for submacro
  168. ;    subroutine calls.  Two are intended as submacros of others.
  169. ;    A maximum of 16 arguments can be handled.
  170. ;
  171. .MACRO    CDECL_args.mode    arg_flags,v1,v2,v3,v4,v5,v6,v7,v8,v9,v10,v11,v12,v13,v14,v15,v16
  172. CDECL_arg_size    =    0
  173. CDECL_arg_count    =    0
  174.     .IFNB    v1
  175.     .IFNB    v2
  176.     .IFNB    v3
  177.     .IFNB    v4
  178.     .IFNB    v5
  179.     .IFNB    v6
  180.     .IFNB    v7
  181.     .IFNB    v8
  182.     .IFNB    v9
  183.     .IFNB    v10
  184.     .IFNB    v11
  185.     .IFNB    v12
  186.     .IFNB    v13
  187.     .IFNB    v14
  188.     .IFNB    v15
  189.     .IFNB    v16
  190.     sub_CDECL_arg.mode    arg_flags>>30,v16
  191.     .ENDIF    v16
  192.     sub_CDECL_arg.mode    arg_flags>>28,v15
  193.     .ENDIF    v15
  194.     sub_CDECL_arg.mode    arg_flags>>26,v14
  195.     .ENDIF    v14
  196.     sub_CDECL_arg.mode    arg_flags>>24,v13
  197.     .ENDIF    v13
  198.     sub_CDECL_arg.mode    arg_flags>>22,v12
  199.     .ENDIF    v12
  200.     sub_CDECL_arg.mode    arg_flags>>20,v11
  201.     .ENDIF    v11
  202.     sub_CDECL_arg.mode    arg_flags>>18,v10
  203.     .ENDIF    v10
  204.     sub_CDECL_arg.mode    arg_flags>>16,v9
  205.     .ENDIF    v9
  206.     sub_CDECL_arg.mode    arg_flags>>14,v8
  207.     .ENDIF    v8
  208.     sub_CDECL_arg.mode    arg_flags>>12,v7
  209.     .ENDIF    v7
  210.     sub_CDECL_arg.mode    arg_flags>>10,v6
  211.     .ENDIF    v6
  212.     sub_CDECL_arg.mode    arg_flags>>8,v5
  213.     .ENDIF    v5
  214.     sub_CDECL_arg.mode    arg_flags>>6,v4
  215.     .ENDIF    v4
  216.     sub_CDECL_arg.mode    arg_flags>>4,v3
  217.     .ENDIF    v3
  218.     sub_CDECL_arg.mode    arg_flags>>2,v2
  219.     .ENDIF    v2
  220.     sub_CDECL_arg.mode    arg_flags,v1
  221.     .ENDIF    v1
  222. .ENDM    CDECL_arg
  223. ;
  224. ;-------------------------------------
  225. ;
  226. .MACRO    CDECL_cleanargs    function,arg_count
  227.     .IF    CDECL_arg_size
  228.     .IF    CDECL_arg_size>8
  229.     add    #CDECL_arg_size,sp
  230.     .ELSE
  231.     addq    #CDECL_arg_size,sp
  232.     .ENDIF
  233.     .ENDIF
  234.     .IF    arg_count!=CDECL_arg_count
  235.     .ERROR    "&function needs another number of arguments"
  236.     .ENDIF
  237. .ENDM    CDECL_cleanargs
  238. ;
  239. ;-------------------------------------
  240. ;
  241. .MACRO    sub_CDECL_arg.mode    flags,arg
  242. CDECL_arg_count    =    CDECL_arg_count+1
  243.     .IF    (flags & 3)==3    ;pointer arg ?
  244. CDECL_arg_size    =    CDECL_arg_size+4
  245.     .IF    '&.mode'=='.i'    ;indirection mode ?
  246.     move.l    arg,-(sp)
  247.     .ELSE    not indirection
  248.     pea    arg
  249.     .ENDIF    indirection
  250.     .ELSE    not pointer arg
  251.     .IF    (flags & 3)==2    ;long arg ?
  252. CDECL_arg_size    =    CDECL_arg_size+4
  253.     move.l    arg,-(sp)
  254.     .ELSE    not long arg
  255.     .IF    (flags & 3)==1    ;word arg ?
  256. CDECL_arg_size    =    CDECL_arg_size+2
  257.     move.w    arg,-(sp)
  258.     .ELSE    not word arg
  259. CDECL_arg_size    =    CDECL_arg_size+2
  260.     move.b    arg,-(sp)
  261.     .ENDIF
  262.     .ENDIF
  263.     .ENDIF
  264. .ENDM    sub_CDECL_arg
  265. ;
  266. ;----------------------------------------------------------------------------
  267. ;    Five macros to implement PUREC argument handling for submacro
  268. ;    subroutine calls.  Two are intended as submacros of others.
  269. ;    A maximum of 16 arguments can be handled.
  270. ;
  271. .MACRO    PUREC_args.mode    arg_flags,v1,v2,v3,v4,v5,v6,v7,v8,v9,v10,v11,v12,v13,v14,v15,v16
  272. PUREC_arg_size    =    0
  273. PUREC_arg_count    =    0
  274. PUREC_areg_used    =    0
  275. PUREC_dreg_used    =    0
  276.     .IFNB    v1
  277.     .IFNB    v2
  278.     .IFNB    v3
  279.     .IFNB    v4
  280.     .IFNB    v5
  281.     .IFNB    v6
  282.     .IFNB    v7
  283.     .IFNB    v8
  284.     .IFNB    v9
  285.     .IFNB    v10
  286.     .IFNB    v11
  287.     .IFNB    v12
  288.     .IFNB    v13
  289.     .IFNB    v14
  290.     .IFNB    v15
  291.     .IFNB    v16
  292.     sub_PUREC_arg.mode    arg_flags>>30,v16
  293.     .ENDIF    v16
  294.     sub_PUREC_arg.mode    arg_flags>>28,v15
  295.     .ENDIF    v15
  296.     sub_PUREC_arg.mode    arg_flags>>26,v14
  297.     .ENDIF    v14
  298.     sub_PUREC_arg.mode    arg_flags>>24,v13
  299.     .ENDIF    v13
  300.     sub_PUREC_arg.mode    arg_flags>>22,v12
  301.     .ENDIF    v12
  302.     sub_PUREC_arg.mode    arg_flags>>20,v11
  303.     .ENDIF    v11
  304.     sub_PUREC_arg.mode    arg_flags>>18,v10
  305.     .ENDIF    v10
  306.     sub_PUREC_arg.mode    arg_flags>>16,v9
  307.     .ENDIF    v9
  308.     sub_PUREC_arg.mode    arg_flags>>14,v8
  309.     .ENDIF    v8
  310.     sub_PUREC_arg.mode    arg_flags>>12,v7
  311.     .ENDIF    v7
  312.     sub_PUREC_arg.mode    arg_flags>>10,v6
  313.     .ENDIF    v6
  314.     sub_PUREC_arg.mode    arg_flags>>8,v5
  315.     .ENDIF    v5
  316.     sub_PUREC_arg.mode    arg_flags>>6,v4
  317.     .ENDIF    v4
  318.     sub_PUREC_arg.mode    arg_flags>>4,v3
  319.     .ENDIF    v3
  320.     sub_PUREC_arg.mode    arg_flags>>2,v2
  321.     .ENDIF    v2
  322.     sub_PUREC_arg.mode    arg_flags,v1
  323.     .ENDIF    v1
  324. .ENDM    PUREC_arg
  325. ;
  326. ;-------------------------------------
  327. ;
  328. .MACRO    PUREC_cleanargs    function,arg_count
  329.     .IF    PUREC_arg_size
  330.     .IF    PUREC_arg_size>8
  331.     add    #PUREC_arg_size,sp
  332.     .ELSE    not size>8
  333.     addq    #PUREC_arg_size,sp
  334.     .ENDIF    size>8
  335.     .ENDIF    size
  336.     .IF    arg_count!=PUREC_arg_count
  337.     .ERROR    "&function needs another number of arguments"
  338.     .ENDIF    count
  339. .ENDM    PUREC_cleanargs
  340. ;
  341. ;-------------------------------------
  342. ;
  343. .MACRO    sub_PUREC_arg.mode    flags,arg
  344. PUREC_arg_count    =    PUREC_arg_count+1
  345.     .IF    (flags & 3)==3    ;pointer arg ?
  346.     .IF    PUREC_areg_used<2
  347.     .IF    PUREC_areg_used<1
  348.     sub_PUREC_ptr.mode    arg,a0,PURE
  349.     .ELSE    not used<1
  350.     sub_PUREC_ptr.mode    arg,a1,PURE
  351.     .ENDIF    used<1
  352. PUREC_areg_used    =    PUREC_areg_used+1
  353.     .ELSE    not used<2
  354. PUREC_arg_size    =    PUREC_arg_size+4
  355.     sub_PUREC_ptr.mode    arg,-(sp),CDEC
  356.     .ENDIF    used<2
  357.     .ELSE    not pointer
  358.     .IF    PUREC_dreg_used<3
  359.     .IF    PUREC_dreg_used<2
  360.     .IF    PUREC_dreg_used<1
  361.     sub_PUREC_data.mode    flags,arg,d0,PURE
  362.     .ELSE    not used<1
  363.     sub_PUREC_data.mode    flags,arg,d1,PURE
  364.     .ENDIF    used<1
  365.     .ELSE    not used<2
  366.     sub_PUREC_data.mode    flags,arg,d2,PURE
  367.     .ENDIF    used<2
  368. PUREC_dreg_used    =    PUREC_dreg_used+1
  369.     .ELSE    not used<3
  370.     sub_PUREC_data.mode    flags,arg,-(sp),CDEC
  371. PUREC_arg_size    =    PUREC_arg_size+PUREC_inc_size
  372.     .ENDIF    used<3
  373.     .ENDIF    pointer
  374. .ENDM    sub_PUREC_arg
  375. ;
  376. ;-------------------------------------
  377. ;
  378. .MACRO    sub_PUREC_data.mode    flags,arg,dest,method
  379.     .IF    (flags & 3)==2    ;long arg ?
  380. PUREC_inc_size    =    4
  381.     move.l    arg,-(sp)
  382.     .ELSE    not long arg
  383. PUREC_inc_size    =    2
  384.     .IF    (flags & 3)==1    ;word arg ?
  385.     move.w    arg,-(sp)
  386.     .ELSE    not word arg
  387.     move.b    arg,-(sp)
  388.     .ENDIF    word
  389.     .ENDIF    long
  390.     .ENDIF    pointer
  391. .ENDM    sub_PUREC_data
  392. ;
  393. ;-------------------------------------
  394. ;
  395. .MACRO    sub_PUREC_ptr.mode    arg,dest,method
  396.     .IF    '&.mode'=='.i'    ;indirection mode ?
  397.     move.l    arg,dest
  398.     .ELSE    not indirection
  399.     .IF    '&method'=='CDEC'    ;stacking ?
  400.     pea    arg
  401.     .ELSE    not stacking
  402.     lea    arg,dest
  403.     .ENDIF    stacking
  404.     .ENDIF    indirection
  405. .ENDM    sub_PUREC_ptr
  406. ;
  407. ;----------------------------------------------------------------------------
  408. ;    Four macros to call subroutines and library functions with arguments
  409. ;
  410. .MACRO    CDECL_sub.mode    subroutine,arg_count,arg_flags,v1,v2,v3,v4,v5,v6,v7,v8,v9,v10,v11,v12,v13,v14,v15,v16
  411.     CDECL_args.mode    arg_flags,v1,v2,v3,v4,v5,v6,v7,v8,v9,v10,v11,v12,v13,v14,v15,v16
  412.     jsr    subroutine
  413.     CDECL_cleanargs    subroutine,arg_count
  414. .ENDM    CDECL_sub
  415. ;
  416. ;-------------------------------------
  417. ;
  418. .MACRO    PUREC_sub.mode    subroutine,arg_count,arg_flags,v1,v2,v3,v4,v5,v6,v7,v8,v9,v10,v11,v12,v13,v14,v15,v16
  419.     PUREC_args.mode    arg_flags,v1,v2,v3,v4,v5,v6,v7,v8,v9,v10,v11,v12,v13,v14,v15,v16
  420.     jsr    subroutine
  421.     PUREC_cleanargs    subroutine,arg_count
  422. .ENDM    PUREC_sub
  423. ;
  424. ;-------------------------------------
  425. ;
  426. .MACRO    CDECL_func.mode    function,arg_count,arg_flags,v1,v2,v3,v4,v5,v6,v7,v8,v9,v10,v11,v12,v13,v14,v15,v16
  427.     CDECL_args.mode    arg_flags,v1,v2,v3,v4,v5,v6,v7,v8,v9,v10,v11,v12,v13,v14,v15,v16
  428.     _uniref    function
  429.     jsr    code_&function
  430.     CDECL_cleanargs    function,arg_count
  431. .ENDM    CDECL_func
  432. ;
  433. ;-------------------------------------
  434. ;
  435. .MACRO    PUREC_func.mode    function,arg_count,arg_flags,v1,v2,v3,v4,v5,v6,v7,v8,v9,v10,v11,v12,v13,v14,v15,v16
  436.     PUREC_args.mode    arg_flags,v1,v2,v3,v4,v5,v6,v7,v8,v9,v10,v11,v12,v13,v14,v15,v16
  437.     _uniref    function
  438.     jsr    code_&function
  439.     PUREC_cleanargs    function,arg_count
  440. .ENDM    PUREC_func
  441. ;
  442. ;----------------------------------------------------------------------------
  443. ;    Macro to XDEF labels only at requested debugging levels
  444. ;needs:    '_deblev' set to the debugging level before macro use
  445. ;
  446. _deblev    =    0
  447. ;
  448. .MACRO    _debdef    symbol,levlim
  449.     .IF    _deblev >= levlim
  450.     XDEF    symbol
  451.     .ENDIF
  452. .ENDM    _debdef
  453. ;
  454. ;----------------------------------------------------------------------------
  455. ;    The following macros implement module linking
  456. ;    on assembly source level of the code
  457. ;
  458. ;
  459. .MACRO    _unidec    sym
  460. _uni_ct_&sym    =    0
  461. _uni_df_&sym    =    0
  462. .ENDM    _unidec
  463. ;
  464. ;
  465. .MACRO    _uniref    sym
  466. _uni_ct_&sym    =    1+_uni_ct_&sym
  467. .ENDM    _uniref
  468. ;
  469. ;
  470. .MACRO    _unidef    v1,v2,v3,v4,v5,v6,v7,v8,v9,va
  471.     ifeq    _uni_df_&v1
  472.     ifne    _uni_ct_&v1
  473. _uni_df_&v1    =    1
  474. _uni_flag    =    1
  475. code_&v1:
  476.     code_&v1
  477.     endif
  478.     endif
  479.     ifnb    v2
  480.     _unidef    v2,v3,v4,v5,v6,v7,v8,v9,va
  481.     endif
  482. .ENDM    _unidef
  483. ;
  484. ;
  485. .MACRO    make    v1,v2,v3,v4,v5,v6,v7,v8,v9,va
  486. _uni_flag    =    0
  487.         &v1
  488.         ifne    _uni_flag
  489.         make    v1
  490.         endif
  491.         ifnb    v2
  492.         make    v2,v3,v4,v5,v6,v7,v8,v9,va
  493.         endif
  494. .ENDM    make
  495. ;
  496. ;----------------------------------------------------------------------------
  497. ;    Macro to create an exception frame on supervisor stack
  498. ;
  499. .MACRO    push_ex.mode    v1,v2
  500.     tst    _longframe
  501.     op_isym    beq.s,.cpu_adapted,uni__v
  502.     clr    -(sp)
  503. sl_isym    .cpu_adapted,uni__v
  504.     .IF    '&.mode'=='.i'
  505.     move.l    v1,-(sp)
  506.     .ELSE
  507.     pea    v1
  508.     .ENDIF    mode
  509.     .IFNB    v2
  510.     .ERROR    "Too many 'push_ex' arguments: &v1,&v2"
  511.     .ENDIF    v2
  512.     move    sr,-(sp)
  513. uni__v    =    uni__v+1
  514. .ENDM    push_ex
  515. ;
  516. ;----------------------------------------------------------------------------
  517. ;    Macro for good 32-bit random function (31-bit pseudorandomicity)
  518. ;NB:    d0 = result  d1 = smashed
  519. ;
  520. rand_32_defined    =    0
  521. ;
  522. .MACRO    rand_32        ;generates 32 new bits per go
  523.     .IF    rand_32_defined == 0
  524.     bsr.s    code_rand_32
  525.     bra.s    code_rand_32_end
  526. ;
  527. code_rand_32:
  528.     move.l    rand_32_seed(pc),d0    ;seed = last value (bit 31 irrelevant)
  529.     move.l    d0,d1    ;copy to d1  (bit 31 will be lost later)
  530.     lsr.l    #3,d1    ;shift d1 by 3 bits for 31 bit pseudorandomicity
  531.     eor.w    d1,d0    ;generate 16 new pseudorandom top bits 
  532.     swap    d0    ;align 16 new bits correctly
  533.     roxl.w    #1,d0    ;align 15 old bits, orig bit 2 as bit 0, lose orig bit 31
  534.     ror.l    #1,d0    ;Adjust 31-bit pseudorandom shifter (bit 31=orig bit 2)
  535.     move.l    d0,d1    ;copy to d1  (dummy bit 31 will be lost later)
  536.     lsr.l    #3,d1    ;shift d1 by 3 bits for 31 bit pseudorandomicity
  537.     eor.w    d1,d0    ;generate 16 new pseudorandom top bits 
  538.     swap    d0    ;align 16 new bits correctly
  539.     roxl.w    #1,d0    ;align 15 old bits, get dummy bit 0, lose dummy bit 31
  540.     ror.l    #1,d0    ;Adjust 31-bit pseudorandom shifter (bit 31 = new dummy)
  541.     move.l    d0,rand_32_seed        ;store seed (bit 31 irrelevant)
  542.     rts
  543. ;
  544. ;NB: In the above "irrelevant" means that bit 31 has no effect on future
  545. ;    results from the generator, although this bit too is pseudorandom.
  546. ;
  547. rand:    dc.l    'Rand'    ;Arbitrary seed.  Avoid 0 and $80000000 (Don't work)
  548. code_rand_32_end:
  549.     .ELSE
  550.     jsr    code_rand_32
  551.     .ENDIF
  552. .ENDM    rand_32
  553. ;
  554. ;----------------------------------------------------------------------------
  555. ;    Macro for good 32-bit hashing function (31-bit pseudorandomicity)
  556. ;NB:    d0 = result  d1 = smashed
  557. ;
  558. hash_32_defined    =    0
  559. ;
  560. .MACRO    hash_32        ;generates 32 new bits per go
  561.     .IF    hash_32_defined == 0
  562.     bsr.s    code_hash_32
  563.     bra.s    code_hash_32_end
  564. ;
  565. code_hash_32:
  566.     move.l    d0,d1    ;copy to d1  (bit 31 will be lost later)
  567.     lsr.l    #3,d1    ;shift d1 by 3 bits for 31 bit pseudorandomicity
  568.     eor.w    d1,d0    ;generate 16 new pseudorandom top bits 
  569.     swap    d0    ;align 16 new bits correctly
  570.     roxl.w    #1,d0    ;align 15 old bits, orig bit 2 as bit 0, lose orig bit 31
  571.     ror.l    #1,d0    ;Adjust 31-bit pseudorandom shifter (bit 31=orig bit 2)
  572.     move.l    d0,d1    ;copy to d1  (dummy bit 31 will be lost later)
  573.     lsr.l    #3,d1    ;shift d1 by 3 bits for 31 bit pseudorandomicity
  574.     eor.w    d1,d0    ;generate 16 new pseudorandom top bits 
  575.     swap    d0    ;align 16 new bits correctly
  576.     roxl.w    #1,d0    ;align 15 old bits, get dummy bit 0, lose dummy bit 31
  577.     ror.l    #1,d0    ;Adjust 31-bit pseudorandom shifter (bit 31 = new dummy)
  578.     rts
  579. code_hash_32_end:
  580.     .ELSE
  581.     jsr    code_hash_32
  582.     .ENDIF
  583. .ENDM    hash_32
  584. ;
  585. ;----------------------------------------------------------------------------
  586. ;    Macro to copy a string    NB: 2 address regs changed
  587. ;
  588. .MACRO    str_copy    src_areg,dest_areg
  589. sl_isym    .str_copy,uni__v
  590.     move.b    (src_areg)+,(dest_areg)+
  591.     op_isym    bne.s,.str_copy,uni__v
  592. uni__v    =    uni__v+1
  593. .ENDM    str_copy
  594. ;
  595. ;----------------------------------------------------------------------------
  596. ;    Macros to copy memory    NB: 2 aregs & 1 dreg changed
  597. ;
  598. .MACRO    mem_copy    src_areg,dest_areg,len_dreg
  599.     cmp.l    src_areg,dest_areg
  600.     op_isym    beq.s,.mem_copy_done_,uni__v
  601.     op_isym    bhi.s,.mem_copy_up_,uni__v
  602. sl_isym    .mem_copy_down_lp_,uni__v
  603.     move.b    (src_areg)+,(dest_areg)+
  604.     subq.l    #1,len_dreg
  605.     op_isym    bgt.s,.mem_copy_down_lp_,uni__v
  606.     op_isym    bra.s,.mem_copy_done_,uni__v
  607. sl_isym    .mem_copy_up_,uni__v
  608.     add.l    len_dreg,src_areg
  609.     add.l    len_dreg,dest_areg
  610. sl_isym    .mem_copy_up_lp_,uni__v
  611.     move.b    -(src_areg),-(dest_areg)
  612.     subq.l    #1,len_dreg
  613.     op_isym    bgt.s,.mem_copy_down_lp_,uni__v
  614. sl_isym    .mem_copy_done_,uni__v
  615. uni__v    =    uni__v+1
  616. .ENDM    mem_copy
  617. ;
  618. .MACRO    mem_copy_l    src_areg,dest_areg,len_dreg
  619.     cmp.l    src_areg,dest_areg
  620.     op_isym    beq.s,.mem_copy_done_,uni__v
  621.     op_isym    bhi.s,.mem_copy_up_,uni__v
  622. sl_isym    .mem_copy_down_lp_,uni__v
  623.     move.b    (src_areg)+,(dest_areg)+
  624.     subq.l    #4,len_dreg
  625.     op_isym    bgt.s,.mem_copy_down_lp_,uni__v
  626.     op_isym    bra.s,.mem_copy_done_,uni__v
  627. sl_isym    .mem_copy_up_,uni__v
  628.     add.l    len_dreg,src_areg
  629.     add.l    len_dreg,dest_areg
  630. sl_isym    .mem_copy_up_lp_,uni__v
  631.     move.b    -(src_areg),-(dest_areg)
  632.     subq.l    #4,len_dreg
  633.     op_isym    bgt.s,.mem_copy_down_lp_,uni__v
  634. sl_isym    .mem_copy_done_,uni__v
  635. uni__v    =    uni__v+1
  636. .ENDM    mem_copy_l
  637. ;
  638. .MACRO    buf_copy    src_areg,dest_areg,len_dreg
  639. sl_isym    .buf_copy_lp_,uni__v
  640.     move.b    (src_areg)+,(dest_areg)+
  641.     subq.l    #1,len_dreg
  642.     op_isym    bgt.s,.buf_copy_lp_,uni__v
  643. uni__v    =    uni__v+1
  644. .ENDM    buf_copy
  645. ;
  646. .MACRO    buf_copy_l    src_areg,dest_areg,len_dreg
  647. sl_isym    .buf_copy_lp_,uni__v
  648.     move.b    (src_areg)+,(dest_areg)+
  649.     subq.l    #4,len_dreg
  650.     op_isym    bgt.s,.buf_copy_lp_,uni__v
  651. uni__v    =    uni__v+1
  652. .ENDM    buf_copy_l
  653. ;
  654. ;----------------------------------------------------------------------------
  655. ;    Macro to pass a string    NB: 1 address reg changed
  656. ;
  657. .MACRO    str_pass    p1
  658. sl_isym    .str_pass,uni__v
  659.     tst.b    (p1)+
  660.     op_isym    bne.s,.str_pass,uni__v
  661. uni__v    =    uni__v+1
  662. .ENDM    str_pass
  663. ;
  664. ;----------------------------------------------------------------------------
  665. ;    Macro to compare two strings    NB: 2 address regs changed
  666. ;
  667. .MACRO    str_comp    p1,p2
  668. sl_isym    .str_comp_loop,uni__v
  669.     tst.b    (p1)
  670.     op_isym    beq.s,.str_comp_term_1,uni__v
  671.     cmpm.b    (p1)+,(p2)+
  672.     op_isym    beq.s,.str_comp_loop,uni__v
  673.     op_isym    bra.s,.str_comp_done,uni__v
  674. sl_isym    .str_comp_term_1,uni__v
  675.     tst.b    (p2)
  676. sl_isym    .str_comp_done,uni__v
  677. uni__v    =    uni__v+1
  678. .ENDM    str_comp
  679. ;
  680. ;----------------------------------------------------------------------------
  681. ;    Ascii constants
  682. ;
  683. NUL    equ    $00
  684. BEL    equ    $07
  685. BS    equ    $08
  686. HT    equ    $09
  687. LF    equ    $0A
  688. VT    equ    $0B
  689. FF    equ    $0C
  690. CR    equ    $0D
  691. ESC    equ    $1B
  692. ;
  693. ;
  694. ;    Diverse constants
  695. ;
  696. maxsbyte    equ    $7F
  697. maxubyte    equ    $FF
  698. maxsword    equ    $7FFF
  699. maxuword    equ    $FFFF
  700. maxslong    equ    $7FFFFFFF
  701. maxulong    equ    $FFFFFFFF
  702. ;
  703. _ind    equ    1<<30    ;bit 30 is indirection flag for some macro libraries
  704. ;
  705. ;
  706. ;----------------------------------------------------------------------------
  707. ;    System init vectors
  708. ;
  709. ssp_init    equ    $000
  710. ev_reset    equ    $004
  711. ;
  712. ;
  713. ;    System exception vectors
  714. ;
  715. ev_buserr    equ    $008
  716. ev_adrerr    equ    $00C
  717. ev_illegal    equ    $010
  718. ev_divby0    equ    $014
  719. ev_chk_ofl    equ    $018
  720. ev_trapv    equ    $01C
  721. ev_priverr    equ    $020
  722. ev_trace    equ    $024
  723. ev_a_line    equ    $028
  724. ev_f_line    equ    $02C
  725. ;
  726. ; vectors at $030..$03B are unassigned
  727. ; vector at $3C is dubiously specified, but can not be considered free
  728. ; vectors at $040..$05F are unassigned
  729. ;
  730. ev_spurerr    equ    $060
  731. ev_level1    equ    $064
  732. ev_level2    equ    $068
  733. ev_level3    equ    $06C
  734. ev_level4    equ    $070
  735. ev_level5    equ    $074
  736. ev_level6    equ    $078
  737. ev_level7    equ    $07C
  738. ; the odd vectors above are unavailable since IPL0 is tied high
  739. ev_HBI        equ    ev_level2
  740. ev_VBI        equ    ev_level4
  741. ev_MFP        equ    ev_level6
  742. ;
  743. ev_trap0    equ    $080
  744. ev_trap1    equ    $084
  745. ev_trap2    equ    $088
  746. ev_trap3    equ    $08C
  747. ev_trap4    equ    $090
  748. ev_trap5    equ    $094
  749. ev_trap6    equ    $098
  750. ev_trap7    equ    $09C
  751. ev_trap8    equ    $0A0
  752. ev_trap9    equ    $0A4
  753. ev_trap10    equ    $0A8
  754. ev_trap11    equ    $0AC
  755. ev_trap12    equ    $0B0
  756. ev_trap13    equ    $0B4
  757. ev_trap14    equ    $0B8
  758. ev_trap15    equ    $0BC
  759. ;
  760. ev_gemdos    equ    ev_trap1
  761. ev_xgemdos    equ    ev_trap2
  762. ev_bios        equ    ev_trap13
  763. ev_xbios    equ    ev_trap14
  764. ;
  765. ; vectors at $0C0..$0FF are unassigned
  766. ;
  767. ;----------------------------------------------------------------------------
  768. ;     interrupt vectors for MFP interrupts
  769. ;
  770. iv_cenbusy    equ    $100
  771. iv_v24dcd    equ    $104
  772. iv_v24cts    equ    $108
  773. iv_blitter    equ    $10C
  774. iv_time_d    equ    $110
  775. iv_time_c    equ    $114
  776. iv_kb_midi    equ    $118
  777. iv_disk        equ    $11C
  778. iv_time_b    equ    $120
  779. iv_v24terr    equ    $124
  780. iv_v24treq    equ    $128
  781. iv_v24rerr    equ    $12C
  782. iv_v24rreq    equ    $130
  783. iv_time_a    equ    $134
  784. iv_v24ring    equ    $138
  785. iv_monodet    equ    $13C
  786. ;
  787. ; vectors at $140..$1FF are unassigned
  788. ; vectors at $200..$37F are reserved for OEM products
  789. ;
  790. ;----------------------------------------------------------------------------
  791. ;     System bomb info for debug analysis
  792. ;
  793. bombflag    equ    $380
  794. bomb_d0        equ    $384
  795. bomb_d1        equ    $388
  796. bomb_d2        equ    $38C
  797. bomb_d3        equ    $390
  798. bomb_d4        equ    $394
  799. bomb_d5        equ    $398
  800. bomb_d6        equ    $39C
  801. bomb_d7        equ    $3A0
  802. bomb_a0        equ    $3A4
  803. bomb_a1        equ    $3A8
  804. bomb_a2        equ    $3AC
  805. bomb_a3        equ    $3B0
  806. bomb_a4        equ    $3B4
  807. bomb_a5        equ    $3B8
  808. bomb_a6        equ    $3BC
  809. bomb_a7        equ    $3C0
  810. bombvector    equ    $3C4
  811. bomb_usp    equ    $3C8
  812. bomb_ssp    equ    bomb_a7
  813. bombstack    equ    $3CC
  814. ;
  815. ; vector area at $3EC..$3FF is unassigned, but known to be used by
  816. ; some system support programs for non_vector purposes (eg. timesave)
  817. ;
  818. ;
  819. ;----------------------------------------------------------------------------
  820. ;     System variables
  821. ;
  822. etv_timer    equ    $400
  823. etv_critic    equ    $404
  824. etv_term    equ    $408
  825. etv_extra    equ    $40C    ;5.L
  826. memvalid    equ    $420
  827. memctrl        equ    $424
  828. resvalid    equ    $426
  829. resvector    equ    $42A
  830. phystop        equ    $42E
  831. _membot        equ    $432
  832. _memtop        equ    $436
  833. memval2        equ    $43A
  834. flock        equ    $43E
  835. seekrate    equ    $440
  836. _timr_ms    equ    $442
  837. _fverify    equ    $444
  838. _bootdev    equ    $446
  839. _palmode    equ    $448
  840. defshiftmd    equ    $44A
  841. sshiftmd    equ    $44C
  842. _v_bas_ad    equ    $44E
  843. vblsem        equ    $452
  844. nvbls        equ    $454
  845. _vblqueue    equ    $456
  846. colorptr    equ    $45A
  847. screenpt    equ    $45E
  848. _vbclock    equ    $462
  849. _frclock    equ    $466
  850. hdv_init    equ    $46A
  851. swv_vec        equ    $46E
  852. hdv_bpb        equ    $472
  853. hdv_rw        equ    $476
  854. hdv_boot    equ    $480
  855. hdv_mediach    equ    $47E
  856. _cmdload    equ    $482
  857. conterm        equ    $484
  858. trp14ret    equ    $486
  859. criticret    equ    $48A
  860. themd        equ    $48E
  861. _md        equ    $49E
  862. savptr        equ    $4A2
  863. _nflops        equ    $4A6
  864. constate    equ    $4A8
  865. save_row    equ    $4AC
  866. sav_contxt    equ    $4AE
  867. _bufl        equ    $4B2
  868. _hz_200        equ    $4BA
  869. the_env        equ    $4BE
  870. _drvbits    equ    $4C2
  871. _dskbufp    equ    $4C6
  872. _autopath    equ    $4CA
  873. _vbl_list    equ    $4CE    ;8.L
  874. _prt_cnt    equ    $4EE
  875. _prtabt        equ    $4F0
  876. _sysbase    equ    $4F2
  877. _shell_p    equ    $4F6
  878. end_os        equ    $4FA
  879. exec_os        equ    $4FE
  880. scr_dump    equ    $502
  881. prv_lsto    equ    $506
  882. prv_lst        equ    $50A
  883. prv_auxo    equ    $50E
  884. prv_aux        equ    $512
  885. pun_ptr        equ    $516
  886. memval3        equ    $51A
  887. dev_vecs    equ    $51E    ;8.L (1.L per device) per I/O function
  888. xconstat    equ    $51E
  889. xconin        equ    $53E
  890. xcostat        equ    $55E
  891. xconout        equ    $57E
  892. _longframe    equ    $59E
  893. _cookies    equ    $5A0
  894. ;
  895. ;
  896. ;----------------------------------------------------------------------------
  897. ;    System vector numbers
  898. ;-------------------------------------
  899. ;        ;vector $00 does not exist (SSP value for reset)
  900. ;-------------------------------------
  901. evn_reset    equ    $01
  902. evn_buserr    equ    $02
  903. evn_adrerr    equ    $03
  904. evn_illegal    equ    $04
  905. evn_divby0    equ    $05
  906. evn_chk_ofl    equ    $06
  907. evn_trapv    equ    $07
  908. evn_priverr    equ    $08
  909. evn_trace    equ    $09
  910. evn_a_line    equ    $0a
  911. evn_f_line    equ    $0b
  912. ;-------------------------------------
  913. ;        ;vectors $0C..$0E are unassigned
  914. ;        ;vector $0F is dubiously specified, but is not free
  915. ;        ;vectors $10..$17 are unassigned
  916. ;-------------------------------------
  917. evn_spurerr    equ    $18
  918. evn_level1    equ    $19
  919. evn_level2    equ    $1a
  920. evn_level3    equ    $1b
  921. evn_level4    equ    $1c
  922. evn_level5    equ    $1d
  923. evn_level6    equ    $1e
  924. evn_level7    equ    $1f
  925. ;         ;odd vectors above are unavailable with IPL0 tied high
  926. ;-------------------------------------
  927. evn_HBI        equ    evn_level2
  928. evn_VBI        equ    evn_level4
  929. evn_MFP        equ    evn_level6
  930. ;-------------------------------------
  931. evn_trap0    equ    $20
  932. evn_trap1    equ    $21
  933. evn_trap2    equ    $22
  934. evn_trap3    equ    $23
  935. evn_trap4    equ    $24
  936. evn_trap5    equ    $25
  937. evn_trap6    equ    $26
  938. evn_trap7    equ    $27
  939. evn_trap8    equ    $28
  940. evn_trap9    equ    $29
  941. evn_trap10    equ    $2a
  942. evn_trap11    equ    $2b
  943. evn_trap12    equ    $2c
  944. evn_trap13    equ    $2d
  945. evn_trap14    equ    $2e
  946. evn_trap15    equ    $2f
  947. ;-------------------------------------
  948. evn_gemdos    equ    evn_trap1
  949. evn_xgemdos    equ    evn_trap2
  950. evn_bios    equ    evn_trap13
  951. evn_xbios    equ    evn_trap14
  952. ;-------------------------------------
  953. ;        ;vectors $30..$3F are unassigned
  954. ;-------------------------------------
  955. ;     MFP interrupt vector numbers
  956. ;-------------------------------------
  957. ivn_cenbusy    equ    $40
  958. ivn_v24dcd    equ    $41
  959. ivn_v24cts    equ    $42
  960. ivn_blitter    equ    $43
  961. ivn_time_d    equ    $44
  962. ivn_time_c    equ    $45
  963. ivn_kb_midi    equ    $46
  964. ivn_disk    equ    $47
  965. ivn_time_b    equ    $48
  966. ivn_v24terr    equ    $49
  967. ivn_v24treq    equ    $4a
  968. ivn_v24rerr    equ    $4b
  969. ivn_v24rreq    equ    $4c
  970. ivn_time_a    equ    $4d
  971. ivn_v24ring    equ    $4e
  972. ivn_monodet    equ    $4f
  973. ;-------------------------------------
  974. ;        ;vectors $50..$7F are unassigned
  975. ;        ;vectors $80..$DF are reserved for OEM products
  976. ;        ;vectors $E0..$FA do not exist (bomb info area)
  977. ;        ;vectors $FB..$FF may not exist (unassigned but often used!)
  978. ;-------------------------------------
  979. ;     System variable vector numbers
  980. ;-------------------------------------
  981. etvn_timer    equ    $100
  982. etvn_critic    equ    $101
  983. etvn_term    equ    $102
  984. ;----------------------------------------------------------------------------
  985. ;    OS header offsets
  986. ;
  987. os_codebra    equ $00    ;w $60xx
  988. os_version    equ $02    ;w $0v0r
  989. os_reset_p    equ $04    ;L
  990. os_selfbeg_p    equ $08    ;L
  991. os_varend_p    equ $0c    ;L
  992. os_unknown_p    equ $10    ;L
  993. os_gem_mpb_p    equ $14    ;L
  994. os_date_bcd    equ $18    ;L
  995. os_config    equ $1c    ;w
  996. os_date_gem    equ $1e    ;w
  997. ;    next follows the part valid only for TOS 1.02 & later
  998. os_pool_p    equ $20
  999. os_kbshift_p    equ $24
  1000. os_currbp_p_p    equ $28
  1001. os_reserved    equ $2c
  1002. ;
  1003. TOS_100_kbshift    equ $E1B
  1004. TOS_100_currbp_p    equ $602C
  1005. ;
  1006. ;-------------------------------------
  1007. ;    Cartridge ROM definitions
  1008. ;
  1009. rom_diag_id    equ $fa52255f
  1010. rom_appl_id    equ $abcdef42
  1011. rom_base    equ $fa0000
  1012. rom_head    equ $fa0004
  1013. ;
  1014. rh_diagcode    equ 0
  1015. rh_applnext_p    equ 0
  1016. rh_applinit_p    equ 4
  1017. rh_applcode_p    equ 8
  1018. rh_appltime    equ 12
  1019. rh_appldate    equ 14
  1020. rh_applsize    equ 16
  1021. rh_applname    equ 20    ;<equ13b incl terminal NUL
  1022. ;
  1023. ;-------------------------------------
  1024. ;    IOREC data structure
  1025. ;
  1026. io_sel_serial    equ 0
  1027. io_sel_keyboard    equ 1
  1028. io_sel_midi    equ 2
  1029. ;
  1030. io_buffer_p    equ  0    ;L-> data buffer (NB: kbd uses 4 bytes/char)
  1031. io_size_ix    equ  4    ;w equ total size of buffer, in bytes
  1032. io_head_ix    equ  6    ;w equ indexes position of next write
  1033. io_tail_ix    equ  8    ;w equ indexes position of next read
  1034. io_lo_fill    equ 10    ;w equ flow reactivation limit
  1035. io_hi_fill    equ 12    ;w equ flow deactivation limit
  1036. ;
  1037. ;-------------------------------------
  1038. ;    KBDVBASE data structure
  1039. ;
  1040. kv_midi_input    equ $00
  1041. kv_keybrd_err    equ $04
  1042. kv_midi_err    equ $08
  1043. kv_ikbd_stat    equ $0C
  1044. kv_mouse_pack    equ $10
  1045. kv_clock_pack    equ $14
  1046. kv_joyst_pack    equ $18
  1047. kv_midi_vec    equ $1C
  1048. kv_ikbd_vec    equ $20
  1049. ;
  1050. ;-------------------------------------
  1051. ;    Virtual Screen cookie structure
  1052. ;
  1053. vs_vs_magic    equ $00    ;l equ 'VSCR' when screen driver is _active_ !!!
  1054. vs_driver_magic equ $04    ;l equ XBRA/Cookie id of screen driver
  1055. vs_version    equ $08    ;w equ version of VSCR protocol (for future exp)
  1056. vs_x        equ $0A    ;w equ left edge \
  1057. vs_y        equ $0C    ;w equ top edge   \/ of visible
  1058. vs_w        equ $0E    ;w equ width      /\ rectangle
  1059. vs_h        equ $10    ;w equ height    /
  1060. vs_size        equ $12    ;size of virtual screen structure
  1061. vs_rect        equ vs_x
  1062. ;
  1063. ;-------------------------------------
  1064. ;    Font header offsets
  1065. ;
  1066. ;NB: Intel format is used in all words and longs, when fnt_flag bit 2 is zero.
  1067. ;NB: Test this as 68000 word, however, for the first byte contains that flag
  1068. ;NB: in Intel mode only, with the second byte zeroed so 68000 test will work.
  1069. ;NB: In 68000 mode the first byte is always zero, so Intel test would .error.
  1070. ;
  1071. fnt_id        equ $00    ;w 
  1072. fnt_pts        equ $02    ;w
  1073. fnt_name    equ $04    ;32b
  1074. fnt_lasc    equ $24    ;w
  1075. fnt_hasc    equ $26    ;w
  1076. fnt_dtop    equ $28    ;w
  1077. fnt_dasce    equ $2A    ;w
  1078. fnt_dhalf    equ $2C    ;w
  1079. fnt_ddesc    equ $2E    ;w
  1080. fnt_dbott    equ $30    ;w
  1081. fnt_charw    equ $32    ;w
  1082. fnt_cellw    equ $34    ;w
  1083. fnt_loff    equ $36    ;w
  1084. fnt_roff    equ $38    ;w
  1085. fnt_weight    equ $3A    ;w
  1086. fnt_ulheight    equ $3C    ;w
  1087. fnt_litemask    equ $3E    ;w
  1088. fnt_skewmask    equ $40    ;w
  1089. fnt_flag    equ $42    ;w
  1090. fnt_hor_tp    equ $44    ;l->horiz. offset table, or equ fnt_chr_tp
  1091. fnt_chr_tp    equ $48    ;l->char. offset table, in files use $58 (fnt_next+4)
  1092. fnt_fbase    equ $4C    ;l->
  1093. fnt_fwidth    equ $50    ;w
  1094. fnt_fheight    equ $52    ;w
  1095. fnt_next    equ $54    ;l->next font in chain
  1096. ;
  1097. ;
  1098. ;----------------------------------------------------------------------------
  1099. ;     fpu offsets (68881 or 68882)
  1100. ;
  1101. fpu_base    equ    $00
  1102. fpu_stat    equ    $00    ;W Rd
  1103. fpu_cont    equ    $02    ;W Wr
  1104. fpu_save    equ    $04    ;W Rd
  1105. fpu_rest    equ    $06    ;W R/W
  1106. fpu_comm    equ    $0A    ;W Wr
  1107. fpu_cond    equ    $0E    ;W Wr
  1108. fpu_oper    equ    $10    ;L R/W
  1109. fpu_rsel    equ    $14    ;W Rd
  1110. fpu_iadr    equ    $18    ;L Wr
  1111. fpu_opad    equ    $1C    ;L R/W (dummy in 68881 and 68882)
  1112. ;
  1113. ;
  1114. ;----------------------------------------------------------------------------
  1115. ;     System hardware
  1116. ;
  1117. hw_mapper    equ    $ffff8001
  1118. ;
  1119. hw_f30_mon_mem    equ    $ffff8006    ;b7.6 3-0equequTV,VGA,PAL,SM  b5.4 3-0equequna,16M,4M,1M
  1120. hw_f30_comp_div    equ    $ffff8007
  1121. ;
  1122. f30_comp_cpu_b    equ 0            ;1 equ> 16 MHz   0 equ> 8 MHz   CPU
  1123. f30_comp_cpu_v    equ 1<<0
  1124. f30_comp_blit_b    equ 2            ;1 equ> 16 MHz   0 equ> 8 MHz   Blitter
  1125. f30_comp_blit_v    equ 1<<2
  1126. f30_comp_bus_b    equ 5            ;1 equ> Falcon   0 equ> STE     Bus
  1127. f30_comp_bus_v  equ 1<<5
  1128. f30_div_mon_b    equ 6            ;1 equ> On       0 equ> Off     Screen
  1129. f30_div_mon_v    equ 1<<6
  1130. ;
  1131. hw_vbase2    equ    $ffff8201    ;base MSB
  1132. hw_vbase1    equ    $ffff8203
  1133. hw_vpos2    equ    $ffff8205    ;pos MSB
  1134. hw_vpos1    equ    $ffff8207
  1135. hw_vpos0    equ    $ffff8209    ;pos LSB
  1136. hw_syn        equ    $ffff820A
  1137. ;
  1138. hw_vbase0H    equ    $ffff820C    ;STE (unused)
  1139. hw_vbase0    equ    $ffff820D    ;base LSB, STE
  1140. hw_horextH    equ    $ffff820E    ;STE (unused)
  1141. hw_horext    equ    $ffff820F    ;STE
  1142. ;
  1143. hw_pal        equ    $ffff8240
  1144. hw_pal_00    equ    hw_pal+00
  1145. hw_pal_01    equ    hw_pal+02
  1146. hw_pal_02    equ    hw_pal+04
  1147. hw_pal_03    equ    hw_pal+06
  1148. hw_pal_04    equ    hw_pal+08
  1149. hw_pal_05    equ    hw_pal+10
  1150. hw_pal_06    equ    hw_pal+12
  1151. hw_pal_07    equ    hw_pal+14
  1152. hw_pal_08    equ    hw_pal+16
  1153. hw_pal_09    equ    hw_pal+18
  1154. hw_pal_10    equ    hw_pal+20
  1155. hw_pal_11    equ    hw_pal+22
  1156. hw_pal_12    equ    hw_pal+24
  1157. hw_pal_13    equ    hw_pal+26
  1158. hw_pal_14    equ    hw_pal+28
  1159. hw_pal_15    equ    hw_pal+30
  1160. ;
  1161. hw_rez        equ    $ffff8260
  1162. ;
  1163. hw_rez_tt    equ    $ffff8262
  1164. ;
  1165. hw_pixoffH    equ    $ffff8264    ;STE (unused)
  1166. hw_pixoff    equ    $ffff8265    ;STE
  1167. ;
  1168. hw_pal_tt    equ    $ffff8400
  1169. ;
  1170. hw_dmadata    equ    $ffff8604
  1171. hw_dmascnt    equ    $ffff8604
  1172. hw_dmastat    equ    $ffff8606
  1173. hw_dmacont    equ    $ffff8606
  1174. hw_dmamode    equ    $ffff8606
  1175. dma_srcmd    equ $080
  1176. dma_srtrk    equ $082
  1177. dma_srsec    equ $084
  1178. dma_srdat    equ $086
  1179. dma_srcnt    equ $090
  1180. dma_wr_bit    equ $100
  1181. dma_swcmd    equ $180
  1182. dma_swtrk    equ $182
  1183. dma_swsec    equ $184
  1184. dma_swdat    equ $186
  1185. dma_swcnt    equ $190
  1186. hw_dmabase2    equ    $ffff8609    ;MSB
  1187. hw_dmabase1    equ    $ffff860B
  1188. hw_dmabase0    equ    $ffff860D    ;LSB
  1189. ;
  1190. hw_scsi_tt_dma3    equ    $ffff8701    ;MSB
  1191. hw_scsi_tt_dma2    equ    $ffff8703
  1192. hw_scsi_tt_dma1    equ    $ffff8705
  1193. hw_scsi_tt_dma0    equ    $ffff8707    ;LSB
  1194. hw_scsi_tt_cnt3    equ    $ffff8709    ;MSB
  1195. hw_scsi_tt_cnt2    equ    $ffff870B
  1196. hw_scsi_tt_cnt1    equ    $ffff870D
  1197. hw_scsi_tt_cnt0    equ    $ffff870F    ;LSB
  1198. hw_scsi_tt_drr    equ    $ffff8710    ;Long
  1199. hw_scsi_tt_cr    equ    $ffff8715    ;Byte
  1200. ;
  1201. hw_5380_tt_dr    equ    $ffff8781
  1202. hw_5380_tt_icr    equ    $ffff8783
  1203. hw_5380_tt_mr    equ    $ffff8785
  1204. hw_5380_tt_tcr    equ    $ffff8787
  1205. hw_5380_tt_idcr    equ    $ffff8789
  1206. hw_5380_tt_stsr    equ    $ffff878B
  1207. hw_5380_tt_trid    equ    $ffff878D
  1208. hw_5380_tt_irrs    equ    $ffff878F
  1209. ;
  1210. hw_giselect    equ    $ffff8800
  1211. hw_psgsel    equ    $ffff8800
  1212. hw_psgrd    equ    $ffff8800
  1213. hw_giwrite    equ    $ffff8802
  1214. hw_psgwr    equ    $ffff8802
  1215. ;
  1216. hw_sdmacontH    equ    $ffff8900    ;STE (unused)
  1217. hw_sdmacont    equ    $ffff8901    ;STE
  1218. hw_sdmabeg2    equ    $ffff8903    ;STE
  1219. hw_sdmabeg1    equ    $ffff8905    ;STE
  1220. hw_sdmabeg0    equ    $ffff8907    ;STE
  1221. hw_sdmaloop2    equ    $ffff8909    ;STE
  1222. hw_sdmaloop1    equ    $ffff890B    ;STE
  1223. hw_sdmaloop0    equ    $ffff890D    ;STE
  1224. hw_sdmaend2    equ    $ffff890F    ;STE
  1225. hw_sdmaend1    equ    $ffff8911    ;STE
  1226. hw_sdmaend0    equ    $ffff8913    ;STE
  1227. ;
  1228. hw_f30_dac_trk    equ    $ffff8920    ;F30
  1229. hw_sdmamode    equ    $ffff8921    ;STE/TT/F30
  1230. ;
  1231. hw_mywiredata    equ    $ffff8922    ;STE/TT 16 bits
  1232. hw_mywiremask    equ    $ffff8924    ;STE/TT 16 bits
  1233. ;
  1234. hw_f30_xbar_sc    equ    $ffff8930    ;word
  1235. hw_f30_xbar_dc    equ    $ffff8932    ;word
  1236. ;
  1237. hw_rtc_tt_ar    equ    $ffff8960    ;word
  1238. hw_rtc_tt_dr    equ    $ffff8962    ;word
  1239. ;
  1240. hw_scc_tt_dma3    equ    $ffff8C01
  1241. hw_scc_tt_dma2    equ    $ffff8C03
  1242. hw_scc_tt_dma1    equ    $ffff8C05
  1243. hw_scc_tt_dma0    equ    $ffff8C07
  1244. hw_scc_tt_cnt3    equ    $ffff8C09
  1245. hw_scc_tt_cnt2    equ    $ffff8C0B
  1246. hw_scc_tt_cnt1    equ    $ffff8C0D
  1247. hw_scc_tt_cnt0    equ    $ffff8C0F
  1248. hw_scc_tt_drr    equ    $ffff8C10    ;Long
  1249. hw_scc_tt_cr    equ    $ffff8C15
  1250. ;
  1251. hw_8530_tt_a_cr    equ    $ffff8C81
  1252. hw_8530_tt_a_dr    equ    $ffff8C83
  1253. hw_8530_tt_b_cr    equ    $ffff8C85
  1254. hw_8530_tt_b_dr    equ    $ffff8C87
  1255. ;
  1256. hw_tt_sys_im    equ    $ffff8E01
  1257. hw_tt_sys_is    equ    $ffff8E03
  1258. hw_tt_sys_ig    equ    $ffff8E05
  1259. hw_tt_vme_ig    equ    $ffff8E07
  1260. hw_tt_scu_gpr1    equ    $ffff8E09
  1261. hw_tt_scu_gpr2    equ    $ffff8E0B
  1262. hw_tt_vme_im    equ    $ffff8E0D
  1263. hw_tt_vme_is    equ    $ffff8E0F
  1264. ;
  1265. hw_switches    equ    $ffff9200    ;FALCON
  1266. hw_joyfire    equ    $ffff9201    ;STE 4 bits
  1267. hw_joydirect    equ    $ffff9202    ;STE 4*4bits
  1268. ;
  1269. hw_pad0_y    equ    $ffff9211    ;STE
  1270. hw_pad0_x    equ    $ffff9213    ;STE
  1271. hw_pad1_y    equ    $ffff9215    ;STE
  1272. hw_pad1_x    equ    $ffff9217    ;STE
  1273. ;
  1274. hw_light_x    equ    $ffff9220    ;STE
  1275. hw_light_y    equ    $ffff9222    ;STE
  1276. ;
  1277. hw_f30_pal    equ    $ffff9800    ;F30
  1278. ;
  1279. hw_dsp_ic    equ    $ffffa200    ;F30
  1280. hw_dsp_cv    equ    $ffffa201    ;F30
  1281. hw_dsp_is    equ    $ffffa202    ;F30
  1282. hw_dsp_iv    equ    $ffffa203    ;F30
  1283. ;
  1284. hw_dsp_d2    equ    $ffffa205    ;F30
  1285. hw_dsp_d1    equ    $ffffa206    ;F30
  1286. hw_dsp_d0    equ    $ffffa207    ;F30
  1287. ;
  1288. hw_mfp        equ    $ffffFA01
  1289. hw_gpip        equ    $ffffFA01
  1290. hw_aer        equ    $ffffFA03
  1291. hw_ddr        equ    $ffffFA05
  1292. hw_iera        equ    $ffffFA07
  1293. hw_ierb        equ    $ffffFA09
  1294. hw_ipra        equ    $ffffFA0B
  1295. hw_iprb        equ    $ffffFA0D
  1296. hw_isra        equ    $ffffFA0F
  1297. hw_isrb        equ    $ffffFA11
  1298. hw_imra        equ    $ffffFA13
  1299. hw_imrb        equ    $ffffFA15
  1300. hw_vr        equ    $ffffFA17
  1301. hw_tacr        equ    $ffffFA19
  1302. hw_tbcr        equ    $ffffFA1B
  1303. hw_tcdcr    equ    $ffffFA1D
  1304. hw_tadr        equ    $ffffFA1F
  1305. hw_tbdr        equ    $ffffFA21
  1306. hw_tcdr        equ    $ffffFA23
  1307. hw_tddr        equ    $ffffFA25
  1308. hw_scr        equ    $ffffFA27
  1309. hw_ucr        equ    $ffffFA29
  1310. hw_rsr        equ    $ffffFA2B
  1311. hw_tsr        equ    $ffffFA2D
  1312. hw_udr        equ    $ffffFA2F
  1313. ;
  1314. hw_fpu_base    equ    $ffffFA40    ;SFP-004 with 68881 or 68882
  1315. hw_fpu_stat    equ    $ffffFA40    ;W Rd
  1316. hw_fpu_cont    equ    $ffffFA42    ;W Wr
  1317. hw_fpu_save    equ    $ffffFA44    ;W Rd
  1318. hw_fpu_rest    equ    $ffffFA46    ;W R/W
  1319. hw_fpu_comm    equ    $ffffFA4A    ;W Wr
  1320. hw_fpu_cond    equ    $ffffFA4E    ;W Wr
  1321. hw_fpu_oper    equ    $ffffFA50    ;L R/W
  1322. hw_fpu_rsel    equ    $ffffFA54    ;W Rd
  1323. hw_fpu_iadr    equ    $ffffFA58    ;L Wr
  1324. hw_fpu_opad    equ    $ffffFA5C    ;L R/W (dummy in 68881 and 68882)
  1325. ;
  1326. hw_tt_mfp2    equ    $fffffa81
  1327. ;
  1328. hw_kbstat    equ    $ffffFC00
  1329. hw_kbcont    equ    $ffffFC00
  1330. hw_kbdata    equ    $ffffFC02
  1331. ;
  1332. hw_midistat    equ    $ffffFC04
  1333. hw_midicont    equ    $ffffFC04
  1334. hw_mididata    equ    $ffffFC06
  1335. ;
  1336. ;----------------------------------------------------------------------------
  1337. ; End of file:    URAn_SYS.SH
  1338. ;----------------------------------------------------------------------------
  1339.